#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>


//
//char* my_strcat(char* dest, const char* src)
//{
//	char* ret = dest;
//	assert(dest && src);
//	while (*dest != '\0')
//	{
//		dest++;
//	}
//	while ((*dest++ = *src++))
//	{
//		;
//	}
//	return ret;
//}
//
//
//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[] = "ghi";
//	my_strcat(arr1, arr2);
//
//	printf("%s\n", arr1);
//
//	return 0;
//}


//int main()
//{
//	char arr1[] = "abc";
//	char arr2[] = "abc";
//  //arr1和arr2的首地址不一样
//	return 0;
//}

//int main()
//{
//	//int a = 10;
//	//int b = 20;
//	//a = b;//常量值可以赋值过去
//
//	char arr1[] = "abcdef";
//	char arr2[20] = { 0 };
//	//arr2 = arr1;//不可以，因为数组名是地址，就是一个常量的值
//	strcpy(arr2, arr1);
//	printf("%s\n", arr2);
//	return 0;
//}


//char* my_strlen(char* des, const char* src)
//{
//	char* ret = des;
//	assert(des && src);
//	//1.找到目标空间的\0
//
//	while (*des != '\0')
//		des++;
//	//数据的拷贝
//	while (*des++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
//int main()
//{
//	char arr1[20] = "abcdefg";
//	char arr2[20] = "hij";
//	
//	my_strlen(arr1, arr2);
//	printf("%s\n", arr1);
//
//	return 0;
//}
/**
* 注意，自己实现的strcat无法连接字符串本身，但库里提供的函数可以实现
*/

//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[20] = "ghi";
//	strcat(arr1, arr1);
//	printf("%s\n", arr1);
//	return 0;
//}

//strcmp函数
//实现两个字符串内容的比较
//标准规定
//第一个字符串大于第二个字符串，则返回大于0的数字
//第一个字符串小于第二个字符串，则返回小于0的数字
//如果两个字符串相等，则返回0
//如果判断两个字符串？比较两个字符串中对应位置上字符ASCII码值的大小

//int my_strcmp(const char* s1, const char* s2)
//{
//	assert(s1 && s2);
//	int ret = 0;
//	while (*s1 == *s2)
//	{
//		if (*s1 == '\0')
//			return 0;
//
//		s1++;
//		s2++;
//	}
//	return *s1 - *s2;
//}
//
//
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[] = "abq";
//
//	int ret = my_strcmp(arr1, arr2);
//
//	printf("%d\n", ret);
//	return 0;
//}


/**
* strcpy,strcat,strcmp都是长度不受限制的字符串函数（不安全函数）
* strncpy,strncat,strncmp是长度受限制的字符串函数（较为安全）
*/

//strncpy
//函数原型
//char* strncpy(char* dest, const char* src, size_t num);
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[20] = "xxxxxxx";
//
//	strncpy(arr2, arr1, 3);
//
//	printf("%s\n", arr2);
//	return 0;
//}
/**
* 该函数拷贝num个字符从源字符串到目标空间，注意，不补\0
* 如果源字符串的长度小于num,则拷贝完源字符串之后，在目标的后面追加\0,知道num个
*/

//strncat函数
//函数原型
//char* strncat(char* dest, const char* src, size_t num);
//将src指向的字符串的前num个字符追加到dest指向的字符串末尾，再追加一个\0字符
//如果src指向的字符串的长度小于num的时候，只会将字符串中到\0的内容追加到dest指向的字符串末尾

//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[20] = "xx\0xxxxxxxx";
//	size_t len = strlen(arr1);
//	strncat(arr2, arr1, len);
//
//	printf("%s\n", arr2);
//
//	return 0;
//}

//strncmp函数
//函数原型
//int strncmp(const char* str1, const char* str2, size_t num);
//比较str1和str2的前num个字符，如果相等就继续往后比较，最多比较num个字母
//如果提前发现不一样，就提前结束.


//int main()
//{
//	char arr1[] = "abcdez";
//	char arr2[] = "abcdef";
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//
//	int ret = strncmp(arr1, arr2, sz);
//	printf("%d\n", ret);
//
//	return 0;
//}